package InnerClass;
//匿名内部类
//1.本质还是类 2.内部类 3.该类没有名字 4.同时还是一个对象
public class AnoymousInnerClass {
    public static void main(String[] args) {
        Outer02 outer02 = new Outer02();
        outer02.method();
    }
}

class Outer02{
    private int n1 = 10;
    public void method(){
        //----基于接口的匿名内部类----
        //1.需求:使用IA接口，并创建对象
        //2.需求:Tiger类只使用一次，后面不在使用
        //3.此时可以使用匿名内部类来简化开发
        //4.tiger的编译类型:IA
        //5.tiger的运行类型:匿名内部类 Outer02$1
        /*
        底层:
        class Outer02$1 implements IA{
         @Override
            public void cry() {
                System.out.println("老虎叫唤...");
            }
        }
         */
        //6.jdk底层在创建匿名内部类的时候立即就创建了Outer02$1实例，并且返回地址给tiger
        //7.匿名内部类Outer02$1使用一次，就不能在使用了
    IA tiger = new IA(){
            @Override
            public void cry() {
                System.out.println("老虎叫唤...");
            }
        };
        System.out.println("tiger的运行类型是:" + tiger.getClass());
        tiger.cry();


        //IA tiger = new Tiger();
        //tiger.cry();



        //----基于类的匿名内部类----
        //1.father的编译类型:Father
        //2.father的运行类型:匿名内部类 Outer02$2
        //3.底层会创建匿名内部类
        /*
        底层:
        class Outer02$2 extends Father{
             @Override
            public void test() {
                System.out.println("匿名内部类重写了test方法..");
            }
        }
         */
        //4.同时也返回了匿名内部类Outer02$2的对象
        Father father = new Father("jack"){
            @Override
            public void test() {
                System.out.println("匿名内部类重写了test方法..");
            }
        };
        System.out.println("father的运行类型是" + father.getClass());
        father.test();


        //----基于抽象类的匿名内部类----
        Animal animal = new Animal(){
            @Override
            void eat() {
                System.out.println("猛吃..");
            }
        };
        System.out.println("animal的运行类型是:" + animal.getClass());
        animal.eat();


    }
}

interface IA{
    void cry();
}

//class Tiger implements IA{
//    @Override
//    public void cry() {
//        System.out.println("老虎叫唤..");
//    }
//}

class Father{
    public Father(String name) {
    }
    public void test(){

    }
}

abstract class Animal{
    abstract void eat();
}
